/**
 * 极速验证
 * @param {*} okCallback
 */
import { Toast } from 'vant';
import { getGtInfo } from '@/api'
import Config from '@/api/config'

let isGtDialogOpen = false
let gtCaptcha = null
let gtOkCallback = null
let gtEndCallback = null
let gtIsInitTip = false
export const gtValidate = function (okCallback, endCallback) {
  if (isGtDialogOpen) {
    if (!gtCaptcha) {
      gtIsInitTip = true
      // 请耐心等待滑块初始化完成。
      Toast($i18n.t('t.gt_init'))
    }
    typeof endCallback === 'function' && endCallback()
    return
  }
  gtOkCallback = okCallback
  gtEndCallback = endCallback
  isGtDialogOpen = true
  if (okCallback && gtCaptcha) {
    gtCaptcha.verify()
    return
  }
  const handler = function (captcha) {
    typeof captcha.onReady === 'function' && captcha.onReady(() => {
      isGtDialogOpen = false
      gtCaptcha = captcha
      if (gtOkCallback) {
        gtCaptcha.verify()
      } else {
        typeof gtEndCallback === 'function' && gtEndCallback()
      }
      if (gtIsInitTip) {
        gtIsInitTip = false
        // 滑块初始化完成，请点击重试。
        Toast($i18n.t('public0.public277'))
      }
    })
    typeof captcha.onSuccess === 'function' && captcha.onSuccess(() => {
      isGtDialogOpen = false
      typeof gtEndCallback === 'function' && gtEndCallback()
      let gtParams = captcha.getValidate()
      if (typeof gtOkCallback === 'function') {
        gtOkCallback({
          geetestChallenge: gtParams.geetest_challenge,
          geetestValidate: gtParams.geetest_validate,
          geetestSeccode: gtParams.geetest_seccode
        })
      }
    })
    typeof captcha.onClose === 'function' && captcha.onClose(() => {
      isGtDialogOpen = false
      typeof gtEndCallback === 'function' && gtEndCallback()
    })
    typeof captcha.onError === 'function' && captcha.onError((error) => {
      isGtDialogOpen = false
      if (error && error.code === 'error_21') {
        $('.geetest_wind.geetest_panel').remove()
        gtCaptcha = null
        gtValidate(gtOkCallback, gtEndCallback)
      } else {
        typeof gtEndCallback === 'function' && gtEndCallback()
      }
    })
  }
  // 调用 initGeetest 初始化参数
  // 参数1：配置参数
  // 参数2：回调，回调的第一个参数验证码对象，之后可以使用它调用相应的接口
  let lang = window.localStorage.getItem('lang') || 'zh-CN'
  if (lang === 'zh-CN') {
    lang = 'zh-cn'
  } else if (lang === 'zh-TW') {
    lang = 'zh-tw'
  } else {
    lang = 'en'
  }
  gtCaptcha = null
  gtIsInitTip = false
  getGtInfo((res) => {
    res = JSON.parse(res)
    window.initGeetest({
      protocol: Config.http, // config.http
      gt: res.gt,
      challenge: res.challenge,
      offline: !res.success, // 表示用户后台检测极验服务器是否宕机，一般不需要关注
      new_captcha: false,
      product: 'bind', // 产品形式，包括：float，popup
      width: '260px',
      height: '44px',
      lang: lang
    }, handler)
  }, () => {
    isGtDialogOpen = false
    typeof gtEndCallback === 'function' && gtEndCallback()
    Toast($i18n.t('error_code.SERVER_ERROR'))
  })
}
